Análisis exploratorio de datos climáticos Realizamos un estudio gráfico de la evolución de la temperatura global desde 1850. Queremos saber:

Si ha habido un aumento significativo de la misma. Si se producen más anomalías que antes térmicamente. Sacar ideas y descriptores a partir de la información proporcionada.

rm(list=ls())
library(reshape2) #facilita la trasnformación entre diferentes formatos de datos.
library(plotly) #https://plot.ly/r/
Loading required package: ggplot2
Use suppressPackageStartupMessages() to eliminate package startup messages.

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(sqldf)
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite

Global Land and Ocean-and-Land Temperatures (GlobalTemperatures.csv):

Date: starts in 1750 for average land temperature and 1850 for max and min land temperatures and global ocean and land temperatures LandAverageTemperature: global average land temperature in celsius LandAverageTemperatureUncertainty: the 95% confidence interval around the average LandMaxTemperature: global average maximum land temperature in celsius LandMaxTemperatureUncertainty: the 95% confidence interval around the maximum land temperature LandMinTemperature: global average minimum land temperature in celsius LandMinTemperatureUncertainty: the 95% confidence interval around the minimum land temperature LandAndOceanAverageTemperature: global average land and ocean temperature in celsius LandAndOceanAverageTemperatureUncertainty: the 95% confidence interval around the global average land and ocean temperature

temperaturas<-read.csv("recursos/GlobalTemperatures.csv")
head(temperaturas)
# eliminamos los valores faltantes
temperaturas <- na.omit(temperaturas)
# damos formato de fecha a la columna dt (Date)
temperaturas$dt <- as.Date(temperaturas$dt,"%Y-%m-%d")
# creamos una columna con información de mes y otra con información de año 
temperaturas$Month<-as.numeric(format(temperaturas$dt,"%m"))
temperaturas$MonthString<-format(temperaturas$dt,"%B")
temperaturas$Year<-as.numeric(format(temperaturas$dt,"%Y"))
temperaturas
head(df, 20)
                                              
1 function (x, df1, df2, ncp, log = FALSE)    
2 {                                           
3     if (missing(ncp))                       
4         .Call(C_df, x, df1, df2, log)       
5     else .Call(C_dnf, x, df1, df2, ncp, log)
6 }                                           

Representamos las temperaturas medias por mes desde 1850. Se puede observar claramente que si bien la temperatura de la tierra se mantiene en una subida suave, la de la tierra y océano tiene una subida más pronunciada en el tiempo.

library(ggplot2)
library(dplyr) #https://rsanchezs.gitbooks.io/rprogramming/content/chapter9/dplyr.html
library(plotly)
#Tierra
leyenda=reorder(temperaturas$MonthString,-temperaturas$LandAverageTemperature,mean)   #El "-" permite ordenar al revés
plot_ly(data = temperaturas, x = ~Year, y = ~LandAverageTemperature, color = leyenda) %>%
  layout(legend = list(x = 1, y = 0.8),title='Variación de la Temperatura Terrestre')

#Mar y tierra
leyenda=reorder(temperaturas$MonthString,-temperaturas$LandAndOceanAverageTemperature,mean)   #El "-" permite ordenar al revés
plot_ly(data = temperaturas, x = ~Year, y = ~LandAndOceanAverageTemperature, color = leyenda) %>%
  layout(legend = list(x = 1, y = 0.8),title='Variación de la Temperatura Media de Mar y Tierra')

Vemos que se produce un aumento significativo a simple vista. Vamos a tratar de cuantificarlo para cada mes.

evolucion_temperaturas<-sqldf("SELECT Year, MonthString,LandAverageTemperature from temperaturas  WHERE Year in(1850,2015)")
temperaturas_1850=evolucion_temperaturas[evolucion_temperaturas$Year=="1850",]
temperaturas_2015=evolucion_temperaturas[evolucion_temperaturas$Year=="2015",]
evolucion<-data.frame("Month"=c(1,2,3,4,5,6,7,8,9,10,11,12), "MonthString"=temperaturas_1850$MonthString,"Diferencia"=temperaturas_2015$LandAverageTemperature-temperaturas_1850$LandAverageTemperature)
plot_ly(evolucion, x = reorder(evolucion$MonthString,evolucion$Month,min),  y = ~Diferencia,
  name = "Evolución Temperatura por mes",
  type = "bar"
)%>%
  layout(title = "Evolución temperaturas desde 1850.",
         xaxis = list(title = "",size = 40,color = "blue"),
         yaxis = list(title = "Diferencia en Grados"))

Observamos que tanto la máxima como la mínima temperatura por año han aumentado casi 3º C desde 1850.

Vamos a revisar las temperaturas máximas y minimas por año

max<-temperaturas %>%
  group_by(Year) %>%
  summarise(MaxTemp=max(LandMaxTemperature,na.rm = TRUE))
max
min<-temperaturas %>%
  group_by(Year) %>%
  summarise(MinTemp=min(LandMinTemperature,na.rm = TRUE)) -> MinByYear
min
ggplot(max, aes(x=Year, y=MaxTemp)) + 
    geom_point() +
    stat_smooth(method = loess, se = FALSE)

ggplot(min, aes(x=Year, y=MinTemp)) + 
    geom_point() +
    stat_smooth(method = loess, se = FALSE)

Vemos que las máximas subieron en torno a 2 grados y las mínimas 1,5.

Vamos a revisar las temperaturas máximas y mínimas medias por año

max_promedio<-temperaturas %>%
  group_by(Year) %>%
  summarise(MaxTemp=mean(LandMaxTemperature,na.rm = TRUE))
min_promedio<-temperaturas %>%
  group_by(Year) %>%
  summarise(MinTemp=mean(LandMinTemperature,na.rm = TRUE)) -> MinByYear
ggplot(max_promedio, aes(x=Year, y=MaxTemp, color=MaxTemp)) + 
    geom_point() +
    stat_smooth(method = loess, se = FALSE) +
    scale_colour_gradientn(colours = terrain.colors(10)) +
    labs(title = "Temperaturas máximas Promedio")

ggplot(min_promedio, aes(x=Year, y=MinTemp, color=MinTemp)) + 
    geom_point() +
    stat_smooth(method = loess, se = FALSE) +
    scale_colour_gradient(low = "white", high = "black") +
    labs(title = "Temperaturas mínimas Promedio")

Vemos que había mas anomalías antes.

ggplot(temperaturas,aes(x=dt,y=LandAndOceanAverageTemperatureUncertainty))+
  geom_point(shape=1)+
  geom_smooth(method="loess")+
  labs(title="Media de la incertidumbre en temperatura de tierra y océano a lo largo del tiempo",
       x="Año",
       y="Incertidumbre de temperatura media")

temperaturas$MonthFactor <- as.factor(temperaturas$Month)
qplot(x = reorder(temperaturas$MonthString,temperaturas$Month,mean), y = LandAndOceanAverageTemperature, data = temperaturas) +
  ggtitle("Gráfico de caja de la temperatura media por mes")+
  geom_boxplot(fill="blue1") +
  labs(x = " ")

NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcyBjbGltw6F0aWNvcwpSZWFsaXphbW9zIHVuIGVzdHVkaW8gZ3LDoWZpY28gZGUgbGEgZXZvbHVjacOzbiBkZSBsYSB0ZW1wZXJhdHVyYSBnbG9iYWwgZGVzZGUgMTg1MC4gUXVlcmVtb3Mgc2FiZXI6CgpTaSBoYSBoYWJpZG8gdW4gYXVtZW50byBzaWduaWZpY2F0aXZvIGRlIGxhIG1pc21hLgpTaSBzZSBwcm9kdWNlbiBtw6FzIGFub21hbMOtYXMgcXVlIGFudGVzIHTDqXJtaWNhbWVudGUuClNhY2FyIGlkZWFzIHkgZGVzY3JpcHRvcmVzIGEgcGFydGlyIGRlIGxhIGluZm9ybWFjacOzbiBwcm9wb3JjaW9uYWRhLgoKYGBge3J9CnJtKGxpc3Q9bHMoKSkKYGBgCgpgYGB7cn0KbGlicmFyeShyZXNoYXBlMikgI2ZhY2lsaXRhIGxhIHRyYXNuZm9ybWFjacOzbiBlbnRyZSBkaWZlcmVudGVzIGZvcm1hdG9zIGRlIGRhdG9zLgpsaWJyYXJ5KHBsb3RseSkgI2h0dHBzOi8vcGxvdC5seS9yLwpsaWJyYXJ5KHNxbGRmKQpgYGAKCgpHbG9iYWwgTGFuZCBhbmQgT2NlYW4tYW5kLUxhbmQgVGVtcGVyYXR1cmVzIChHbG9iYWxUZW1wZXJhdHVyZXMuY3N2KToKCkRhdGU6IHN0YXJ0cyBpbiAxNzUwIGZvciBhdmVyYWdlIGxhbmQgdGVtcGVyYXR1cmUgYW5kIDE4NTAgZm9yIG1heCBhbmQgbWluIGxhbmQgdGVtcGVyYXR1cmVzIGFuZCBnbG9iYWwgb2NlYW4gYW5kIGxhbmQgdGVtcGVyYXR1cmVzCkxhbmRBdmVyYWdlVGVtcGVyYXR1cmU6IGdsb2JhbCBhdmVyYWdlIGxhbmQgdGVtcGVyYXR1cmUgaW4gY2Vsc2l1cwpMYW5kQXZlcmFnZVRlbXBlcmF0dXJlVW5jZXJ0YWludHk6IHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBhcm91bmQgdGhlIGF2ZXJhZ2UKTGFuZE1heFRlbXBlcmF0dXJlOiBnbG9iYWwgYXZlcmFnZSBtYXhpbXVtIGxhbmQgdGVtcGVyYXR1cmUgaW4gY2Vsc2l1cwpMYW5kTWF4VGVtcGVyYXR1cmVVbmNlcnRhaW50eTogdGhlIDk1JSBjb25maWRlbmNlIGludGVydmFsIGFyb3VuZCB0aGUgbWF4aW11bSBsYW5kIHRlbXBlcmF0dXJlCkxhbmRNaW5UZW1wZXJhdHVyZTogZ2xvYmFsIGF2ZXJhZ2UgbWluaW11bSBsYW5kIHRlbXBlcmF0dXJlIGluIGNlbHNpdXMKTGFuZE1pblRlbXBlcmF0dXJlVW5jZXJ0YWludHk6IHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBhcm91bmQgdGhlIG1pbmltdW0gbGFuZCB0ZW1wZXJhdHVyZQpMYW5kQW5kT2NlYW5BdmVyYWdlVGVtcGVyYXR1cmU6IGdsb2JhbCBhdmVyYWdlIGxhbmQgYW5kIG9jZWFuIHRlbXBlcmF0dXJlIGluIGNlbHNpdXMKTGFuZEFuZE9jZWFuQXZlcmFnZVRlbXBlcmF0dXJlVW5jZXJ0YWludHk6IHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBhcm91bmQgdGhlIGdsb2JhbCBhdmVyYWdlIGxhbmQgYW5kIG9jZWFuIHRlbXBlcmF0dXJlCgpgYGB7cn0KdGVtcGVyYXR1cmFzPC1yZWFkLmNzdigicmVjdXJzb3MvR2xvYmFsVGVtcGVyYXR1cmVzLmNzdiIpCmhlYWQodGVtcGVyYXR1cmFzKQoKYGBgCgpgYGB7cn0KIyBlbGltaW5hbW9zIGxvcyB2YWxvcmVzIGZhbHRhbnRlcwp0ZW1wZXJhdHVyYXMgPC0gbmEub21pdCh0ZW1wZXJhdHVyYXMpCgojIGRhbW9zIGZvcm1hdG8gZGUgZmVjaGEgYSBsYSBjb2x1bW5hIGR0IChEYXRlKQp0ZW1wZXJhdHVyYXMkZHQgPC0gYXMuRGF0ZSh0ZW1wZXJhdHVyYXMkZHQsIiVZLSVtLSVkIikKCiMgY3JlYW1vcyB1bmEgY29sdW1uYSBjb24gaW5mb3JtYWNpw7NuIGRlIG1lcyB5IG90cmEgY29uIGluZm9ybWFjacOzbiBkZSBhw7FvIAp0ZW1wZXJhdHVyYXMkTW9udGg8LWFzLm51bWVyaWMoZm9ybWF0KHRlbXBlcmF0dXJhcyRkdCwiJW0iKSkKdGVtcGVyYXR1cmFzJE1vbnRoU3RyaW5nPC1mb3JtYXQodGVtcGVyYXR1cmFzJGR0LCIlQiIpCnRlbXBlcmF0dXJhcyRZZWFyPC1hcy5udW1lcmljKGZvcm1hdCh0ZW1wZXJhdHVyYXMkZHQsIiVZIikpCgp0ZW1wZXJhdHVyYXMKCmhlYWQoZGYsIDIwKQpgYGAKCgpSZXByZXNlbnRhbW9zIGxhcyB0ZW1wZXJhdHVyYXMgbWVkaWFzIHBvciBtZXMgZGVzZGUgMTg1MC4gU2UgcHVlZGUgb2JzZXJ2YXIgY2xhcmFtZW50ZSBxdWUgc2kgYmllbiBsYSB0ZW1wZXJhdHVyYSBkZSBsYSB0aWVycmEgc2UgbWFudGllbmUgZW4gdW5hIHN1YmlkYSBzdWF2ZSwgbGEgZGUgbGEgdGllcnJhIHkgb2PDqWFubyB0aWVuZSB1bmEgc3ViaWRhIG3DoXMgcHJvbnVuY2lhZGEgZW4gZWwgdGllbXBvLgoKYGBge3IgcmVzdWx0cz0nYXNpcycsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpICNodHRwczovL3JzYW5jaGV6cy5naXRib29rcy5pby9ycHJvZ3JhbW1pbmcvY29udGVudC9jaGFwdGVyOS9kcGx5ci5odG1sCmxpYnJhcnkocGxvdGx5KQoKI1RpZXJyYQpsZXllbmRhPXJlb3JkZXIodGVtcGVyYXR1cmFzJE1vbnRoU3RyaW5nLC10ZW1wZXJhdHVyYXMkTGFuZEF2ZXJhZ2VUZW1wZXJhdHVyZSxtZWFuKSAgICNFbCAiLSIgcGVybWl0ZSBvcmRlbmFyIGFsIHJldsOpcwpwbG90X2x5KGRhdGEgPSB0ZW1wZXJhdHVyYXMsIHggPSB+WWVhciwgeSA9IH5MYW5kQXZlcmFnZVRlbXBlcmF0dXJlLCBjb2xvciA9IGxleWVuZGEpICU+JQogIGxheW91dChsZWdlbmQgPSBsaXN0KHggPSAxLCB5ID0gMC44KSx0aXRsZT0nVmFyaWFjacOzbiBkZSBsYSBUZW1wZXJhdHVyYSBUZXJyZXN0cmUnKQoKI01hciB5IHRpZXJyYQpsZXllbmRhPXJlb3JkZXIodGVtcGVyYXR1cmFzJE1vbnRoU3RyaW5nLC10ZW1wZXJhdHVyYXMkTGFuZEFuZE9jZWFuQXZlcmFnZVRlbXBlcmF0dXJlLG1lYW4pICAgI0VsICItIiBwZXJtaXRlIG9yZGVuYXIgYWwgcmV2w6lzCnBsb3RfbHkoZGF0YSA9IHRlbXBlcmF0dXJhcywgeCA9IH5ZZWFyLCB5ID0gfkxhbmRBbmRPY2VhbkF2ZXJhZ2VUZW1wZXJhdHVyZSwgY29sb3IgPSBsZXllbmRhKSAlPiUKICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMSwgeSA9IDAuOCksdGl0bGU9J1ZhcmlhY2nDs24gZGUgbGEgVGVtcGVyYXR1cmEgTWVkaWEgZGUgTWFyIHkgVGllcnJhJykKCmBgYAoKVmVtb3MgcXVlIHNlIHByb2R1Y2UgdW4gYXVtZW50byBzaWduaWZpY2F0aXZvIGEgc2ltcGxlIHZpc3RhLiBWYW1vcyBhIHRyYXRhciBkZSBjdWFudGlmaWNhcmxvIHBhcmEgY2FkYSBtZXMuCmBgYHtyfQpldm9sdWNpb25fdGVtcGVyYXR1cmFzPC1zcWxkZigiU0VMRUNUIFllYXIsIE1vbnRoU3RyaW5nLExhbmRBdmVyYWdlVGVtcGVyYXR1cmUgZnJvbSB0ZW1wZXJhdHVyYXMgIFdIRVJFIFllYXIgaW4oMTg1MCwyMDE1KSIpCnRlbXBlcmF0dXJhc18xODUwPWV2b2x1Y2lvbl90ZW1wZXJhdHVyYXNbZXZvbHVjaW9uX3RlbXBlcmF0dXJhcyRZZWFyPT0iMTg1MCIsXQp0ZW1wZXJhdHVyYXNfMjAxNT1ldm9sdWNpb25fdGVtcGVyYXR1cmFzW2V2b2x1Y2lvbl90ZW1wZXJhdHVyYXMkWWVhcj09IjIwMTUiLF0KZXZvbHVjaW9uPC1kYXRhLmZyYW1lKCJNb250aCI9YygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiksICJNb250aFN0cmluZyI9dGVtcGVyYXR1cmFzXzE4NTAkTW9udGhTdHJpbmcsIkRpZmVyZW5jaWEiPXRlbXBlcmF0dXJhc18yMDE1JExhbmRBdmVyYWdlVGVtcGVyYXR1cmUtdGVtcGVyYXR1cmFzXzE4NTAkTGFuZEF2ZXJhZ2VUZW1wZXJhdHVyZSkKCnBsb3RfbHkoZXZvbHVjaW9uLCB4ID0gcmVvcmRlcihldm9sdWNpb24kTW9udGhTdHJpbmcsZXZvbHVjaW9uJE1vbnRoLG1pbiksICB5ID0gfkRpZmVyZW5jaWEsCiAgbmFtZSA9ICJFdm9sdWNpw7NuIFRlbXBlcmF0dXJhIHBvciBtZXMiLAogIHR5cGUgPSAiYmFyIgopJT4lCiAgbGF5b3V0KHRpdGxlID0gIkV2b2x1Y2nDs24gdGVtcGVyYXR1cmFzIGRlc2RlIDE4NTAuIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIiIsc2l6ZSA9IDQwLGNvbG9yID0gImJsdWUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRpZmVyZW5jaWEgZW4gR3JhZG9zIikpCmBgYApPYnNlcnZhbW9zIHF1ZSB0YW50byBsYSBtw6F4aW1hIGNvbW8gbGEgbcOtbmltYSB0ZW1wZXJhdHVyYSBwb3IgYcOxbyBoYW4gYXVtZW50YWRvIGNhc2kgM8K6IEMgZGVzZGUgMTg1MC4KClZhbW9zIGEgcmV2aXNhciBsYXMgdGVtcGVyYXR1cmFzIG3DoXhpbWFzIHkgbWluaW1hcyBwb3IgYcOxbwpgYGB7cn0KbWF4PC10ZW1wZXJhdHVyYXMgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKE1heFRlbXA9bWF4KExhbmRNYXhUZW1wZXJhdHVyZSxuYS5ybSA9IFRSVUUpKQoKbWluPC10ZW1wZXJhdHVyYXMgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKE1pblRlbXA9bWluKExhbmRNaW5UZW1wZXJhdHVyZSxuYS5ybSA9IFRSVUUpKSAtPiBNaW5CeVllYXIKCmdncGxvdChtYXgsIGFlcyh4PVllYXIsIHk9TWF4VGVtcCkpICsgCiAgICBnZW9tX3BvaW50KCkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gbG9lc3MsIHNlID0gRkFMU0UpCgpnZ3Bsb3QobWluLCBhZXMoeD1ZZWFyLCB5PU1pblRlbXApKSArIAogICAgZ2VvbV9wb2ludCgpICsKICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9IGxvZXNzLCBzZSA9IEZBTFNFKQpgYGAKVmVtb3MgcXVlIGxhcyBtw6F4aW1hcyBzdWJpZXJvbiBlbiB0b3JubyBhIDIgZ3JhZG9zIHkgbGFzIG3DrW5pbWFzIDEsNS4KCgpWYW1vcyBhIHJldmlzYXIgbGFzIHRlbXBlcmF0dXJhcyBtw6F4aW1hcyB5IG3DrW5pbWFzIG1lZGlhcyBwb3IgYcOxbwpgYGB7cn0KbWF4X3Byb21lZGlvPC10ZW1wZXJhdHVyYXMgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKE1heFRlbXA9bWVhbihMYW5kTWF4VGVtcGVyYXR1cmUsbmEucm0gPSBUUlVFKSkKCm1pbl9wcm9tZWRpbzwtdGVtcGVyYXR1cmFzICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShNaW5UZW1wPW1lYW4oTGFuZE1pblRlbXBlcmF0dXJlLG5hLnJtID0gVFJVRSkpIC0+IE1pbkJ5WWVhcgoKZ2dwbG90KG1heF9wcm9tZWRpbywgYWVzKHg9WWVhciwgeT1NYXhUZW1wLCBjb2xvcj1NYXhUZW1wKSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzdGF0X3Ntb290aChtZXRob2QgPSBsb2Vzcywgc2UgPSBGQUxTRSkgKwogICAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvdXJzID0gdGVycmFpbi5jb2xvcnMoMTApKSArCiAgICBsYWJzKHRpdGxlID0gIlRlbXBlcmF0dXJhcyBtw6F4aW1hcyBQcm9tZWRpbyIpCgpnZ3Bsb3QobWluX3Byb21lZGlvLCBhZXMoeD1ZZWFyLCB5PU1pblRlbXAsIGNvbG9yPU1pblRlbXApKSArIAogICAgZ2VvbV9wb2ludCgpICsKICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9IGxvZXNzLCBzZSA9IEZBTFNFKSArCiAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJibGFjayIpICsKICAgIGxhYnModGl0bGUgPSAiVGVtcGVyYXR1cmFzIG3DrW5pbWFzIFByb21lZGlvIikKYGBgCgpWZW1vcyBxdWUgaGFiw61hIG1hcyBhbm9tYWzDrWFzIGFudGVzLiAKCgoKYGBge3J9CmdncGxvdCh0ZW1wZXJhdHVyYXMsYWVzKHg9ZHQseT1MYW5kQW5kT2NlYW5BdmVyYWdlVGVtcGVyYXR1cmVVbmNlcnRhaW50eSkpKwogIGdlb21fcG9pbnQoc2hhcGU9MSkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIpKwogIGxhYnModGl0bGU9Ik1lZGlhIGRlIGxhIGluY2VydGlkdW1icmUgZW4gdGVtcGVyYXR1cmEgZGUgdGllcnJhIHkgb2PDqWFubyBhIGxvIGxhcmdvIGRlbCB0aWVtcG8iLAogICAgICAgeD0iQcOxbyIsCiAgICAgICB5PSJJbmNlcnRpZHVtYnJlIGRlIHRlbXBlcmF0dXJhIG1lZGlhIikKYGBgCgpgYGB7cn0KdGVtcGVyYXR1cmFzJE1vbnRoRmFjdG9yIDwtIGFzLmZhY3Rvcih0ZW1wZXJhdHVyYXMkTW9udGgpCgpxcGxvdCh4ID0gcmVvcmRlcih0ZW1wZXJhdHVyYXMkTW9udGhTdHJpbmcsdGVtcGVyYXR1cmFzJE1vbnRoLG1lYW4pLCB5ID0gTGFuZEFuZE9jZWFuQXZlcmFnZVRlbXBlcmF0dXJlLCBkYXRhID0gdGVtcGVyYXR1cmFzKSArCiAgZ2d0aXRsZSgiR3LDoWZpY28gZGUgY2FqYSBkZSBsYSB0ZW1wZXJhdHVyYSBtZWRpYSBwb3IgbWVzIikrCiAgZ2VvbV9ib3hwbG90KGZpbGw9ImJsdWUxIikgKwogIGxhYnMoeCA9ICIgIikKICAKCmBgYAoKCg==